/** SetDateTime_ReadSerial.cpp
 *
 * 通过串口发送日期时间数据进行RCT时钟的校准.
 * 基于Ds1302 1.0.4版本修改及汉化
 * 
 * @license GNU Affero General Public License v3.0
 * @原Ds1302库开源地址 https://github.com/Treboada/Ds1302
 * @小小牛牛
 */

#include <Arduino.h>
#include <DS1302.h>

#define PIN_ENA  9
#define PIN_CLK  11
#define PIN_DAT  10
// 创建一个DS1302实例
Ds1302 rtc(PIN_ENA, PIN_CLK, PIN_DAT);

//串口数据分离出日期时间函数
uint8_t parseDigits(char* str, uint8_t count)
{
    uint8_t val = 0;
    while(count-- > 0) val = (val * 10) + (*str++ - '0');
    return val;
}


void setup()
{
    // 初始化 RTC  时钟芯片
    rtc.init();

    Serial.begin(9600);
    //请以年月日星期时分秒 的格式发送设置时间数据
    Serial.println("Input the date and time (YYMMDDWhhmmss): ");
}


void loop()
{
    static char buffer[13];
    static uint8_t char_idx = 0;

    if (char_idx == 13)     //如果串口接收到正确格式的数据
    {
        // 根据格式分离出对应的日期时间数据
        Ds1302::DateTime dt;

        dt.year = parseDigits(buffer, 2);
        dt.month = parseDigits(buffer + 2, 2);
        dt.day = parseDigits(buffer + 4, 2);
        dt.dow = parseDigits(buffer + 6, 1);
        dt.hour = parseDigits(buffer + 7, 2);
        dt.minute = parseDigits(buffer + 9, 2);
        dt.second = parseDigits(buffer + 11, 2);

        //写入以上设置的初始时间数据到RTC芯片
        rtc.setDateTime(&dt);

        char_idx = 0;
    }

    if (Serial.available())   //接收串口数据
    {
        buffer[char_idx++] = Serial.read();
    }

}
